<?php

require_once 'Zend/Config/Xml.php';
require_once 'Zend/Cache.php';
require_once 'Zend/Cache/Frontend/File.php';
require_once 'Zend/Cache/Backend/File.php';

/**
 * Класс для загрузки и склейки массивов конфигурационных xml-файлов приложения
 * 
 * @category Phorm
 * @package Application
 * @name /Phorm/Application/Config.php
 * @copyright phorm.ru
 * @since 27.01.2011
 * @author vladimir@kachalov.net
 */

class Phorm_Application_Config {
	
	/**
	 * Склеивает все файлы в единый конфиг, попутно задействуя кеш
	 *
	 * @param string $path Путь к папке с файлами
	 * @param string $env APPLICATION_ENV
	 * @return array
	 */
	
	public static function load($path, $env) {
		
		$masterfiles = array();

		if(file_exists($path . 'application.xml')) {
			
			$handler = opendir($path);
			
			while (($file = readdir($handler)) !== false) {
				if(strtolower(pathinfo($file, PATHINFO_EXTENSION))=='xml') $masterfiles[] = $path . $file;
			}
			
			sort($masterfiles);
			
			closedir($handler);
			
			$cache = self::getCache($masterfiles);
			
			$cacheid = md5($path);
			
			if($cache->test($cacheid)) {
				
				return $cache->load($cacheid);
				
			} else {
				
				$config = new Zend_Config_Xml($path . 'application.xml', $env, array('allowModifications'=>true));
				
				foreach ($masterfiles as $file) {
					if($file!='application.xml') {
						$config->merge(new Zend_Config_Xml($file, $env));
					}
				}
				
				$config = $config->toArray();
				
				$cache->save($config,$cacheid);
				
				return $config;
				
			}
		
		}
		
		return false;
		
	}
	
	
	/**
	 * Получаем объект кеша (все пути и настройки тупо захордкорджены)
	 * @todo В последствии надо перенести на использование объекта кеша из реестра загрузки
	 *
	 * @param array $masterfiles
	 * @return Zend_Cache
	 */
	
	public static function getCache($masterfiles = array()) {
		
		$frontendOptions = array(
			'automatic_serialization' => true,
			'master_files' => $masterfiles,
			'caching' => true
		);
		
		$backendOptions = array(
			'cache_dir' => APPLICATION_PATH . '/cache/Files/'
		);
		
		$cache = Zend_Cache::factory('File','File',$frontendOptions,$backendOptions);
		
		return $cache;
		
	}
	
}